<html>
	<head>
		<title> SiMple Object Language - About </title>
		<meta name = "keywords" content = "" />
		<meta name = "description" content = "" />
		<meta http-equiv="content-type" content="text/html; charset=utf-8">
	</head>
<body>
	<div class="wiki">
	<h1 id="ИНТЕРПРЕТАТОР-ЯЗЫКА-SMOL-br-SiMple-Object-Language">ИНТЕРПРЕТАТОР ЯЗЫКА SMOL <br />    (SiMple Object Language)<a href="#ИНТЕРПРЕТАТОР-ЯЗЫКА-SMOL-br-SiMple-Object-Language" class="wiki-anchor">&para;</a></h1>
	
	
		<h2 id="1-Краткий-обзор">1  Краткий обзор<a href="#1-Краткий-обзор" class="wiki-anchor">&para;</a></h2>
	
	
	<strong>Smol</strong> – интерпретируемый язык программирования, функциональность которого базируется на использовании объектов. Следовательно, каждый тип данных в нем, будь то какой-либо литерал или символьная строка, – объект. В связи с этим данный язык поддерживает все парадигмы объектно-ориентированного программирования.<br />Из основных идеологий и принципов языка программирования Smol можно выделить следующие:
		<ol>
		<li>Каждая переменная являет собой ссылку. Присвоение одной переменной другой приводит к простому копированию ссылки, а не полностью всего объекта.</li>
			<li>Отсутствует вообще как таковое отдельное понятие «функция». Все действия над объектами сводятся к вызовам одного из множества методов свойственных конкретному типу объекта. Например сохранение содержимого объекта в файл (маршалинг) сводится к простому вызову метода obj.Marshaling(“file”). </li>
	
			<li>Отсутствует необходимость в контроле по созданию новых переменных и дальнейшем освобождении занимаемой ними памятью. Все эти операции берет на себя «сборщик мусора», что при написании скриптов ориентированных на долгую «зацикленную» работу является очень удобных и отвечает современных принципам по созданию языков программирования.</li>
			<li>Оперирование над объектами сводится не к привычной схеме для процедурного программирования «переменная = результат некоторой операции», а к более характерной для объектов, в некоторой степени автоматной – «объект.действие()». Например, для того чтобы создать какую-нибудь «числовую» переменную со случайным значением и затем взять от нее модуль необходимо написать:</li>
		</ol>
	
	
		<p><code>var num = new (Int); num.Rand(); num.Abs()</code></p>
	
	
		<h2 id="2-Описание-языка">2  Описание языка<a href="#2-Описание-языка" class="wiki-anchor">&para;</a></h2>
	
	
		<p>В состав языка Smol входят следующие основные типы объектов: Object, Integer, Float, Boolean, String, Array, Hash.<br />Object является базовым для всех остальных типов. Т.е. любая из объявленных переменных типа Object может ссылаться на объекты остальных базовых типов. Данное свойство языка вполне соотвествует идиомам связанных с объектно-ориентированным программированием. В данном случае это классический пример полиморфизма. Инкапсуляция, как таковая, в данном языке отсутствует, каждое поле добавляемое к объекту являет собой в некоторой степени свойство с наперед заданными getters/setters по умолчанию. Наследование в явной форме тоже отсутствует, оно реализовано на уровне технической реализации языка и проявляется в различных его особенностях, в частности как уже упоминалось при использовании полиморфизма. Smol не поддерживает объявление каких-либо пользовательских классов, т.е. программирование на нем сводится к манипуляции над существующими классами объектов и использовании множества методов которые они предоставляют. В некоторой степени всеже можно создавать объекты требуемой структуры на основе типа Object и динамическом создании необходимых полей. Например:</p>
	
	
		<p><code>var obj = new();</code><br /><code>obj.Name = new(String);</code><br /><code>obj.Old = new(Int);</code><br /><code>obj.Name = “Vasya”;</code><br /><code>obj.Old = 20;</code></p>
	
	
		<h3 id="21-Описание-основных-типов">2.1  Описание основных типов<a href="#21-Описание-основных-типов" class="wiki-anchor">&para;</a></h3>
	
	
		<p>Далее следует подробное описание каждого из типов языка.</p>
	
	
		<h3 id="211-Object">2.1.1  Object<a href="#211-Object" class="wiki-anchor">&para;</a></h3>
	
	
	Базовый тип. Реализует некоторые общие для остальных объектов методы, поддержку полиморфизма и является своего рода коллекцией для динамически создаваемых полей одного из возможных типов.<br />Методы:
		<ul>
	
		<li>ToName(): String – возвращает имя объекта (по сути название переменной) и его хеш. </li>
			<li>ToHash(): Hash – преобразует содержимое объекта в хеш-таблицу и возвращает результат в виде «ключ - значение».</li>
			<li>ClassName(): String – возвращает название типа объекта. Например: String, Float, Hash.</li>
			<li>Marshaling(filename): Boolean – производит маршалинг объекта. </li>
			<li>Demarshaling(filename): Boolean – производит демаршалинг объекта. </li>
			<li>Remove() – «жесткое» удаление объекта.</li>
	
		</ul>
	
	
		<h3 id="212-Integer">2.1.2  Integer<a href="#212-Integer" class="wiki-anchor">&para;</a></h3>
	
	
	Объекты данного типа позволяют проиводить базовые операции над целыми числами.<br />Методы:
		<ul>
		<li>ToString(): String – преобразует числовое значение в строку.</li>
			<li>Abs() – числовое значение по модулю.</li>
	
			<li>Rand() – случайное числовое значение.</li>
			<li>Sqr() – возведение в квадрат.</li>
			<li>Step(n) – возведение в произвольную степень n.</li>
		</ul>
	
	
		<h3 id="213-Float">2.1.3  Float<a href="#213-Float" class="wiki-anchor">&para;</a></h3>
	
	Объекты данного типа позволяют проиводить базовые операции над дробными числами с плавающей запятой.<br />Методы:
		<ul>
		<li>ToString(): String – преобразует числовое значение в строку.</li>
			<li>Abs() – числовое значение по модулю.</li>
			<li>Rand() – случайное числовое значение.</li>
			<li>Sqr() – возведение в квадрат.</li>
			<li>Step(n) – возведение в произвольную степень n.</li>
	
			<li>Fixed(n) – округление до знака n после запятой.</li>
		</ul>
	
	
		<h3 id="214-Boolean">2.1.4  Boolean<a href="#214-Boolean" class="wiki-anchor">&para;</a></h3>
	
	
		<p>Объекты данного типа содержат логический результат некоторых операций и выражений, выступают в качестве флагов. Могут содержать одно из двух значений: true или false.</p>
	
	
		<h3 id="215-String">2.1.5  String<a href="#215-String" class="wiki-anchor">&para;</a></h3>
	
	
	Объекты данного типа позволяют проиводить базовые операции над строками.<br />Методы:
		<ul>
		<li>Length(): Integer – возвращает длину строки.</li>
			<li>Split(delim): Array – разбивает строку на токены согласно разделителю delim и возвращает результат в виде массива.</li>
			<li>Invert() – инвертирование содержимого строки.</li>
	
			<li>IndexOf(str): Integer – возвращает первый индекс вхождения подстоки str.</li>
			<li>LastIndexOf(str): Integer – возвращает последний индекс вхождения подстоки str.</li>
		</ul>
	
	
		<h3 id="216-Array">2.1.6  Array<a href="#216-Array" class="wiki-anchor">&para;</a></h3>
	
	
	Объекты данного типа позволяют проиводить базовые операции над массивами. Каждый элемент массива имеет тип Object, т.е. фактически в одном массиве можно хранить коллекцию объектов различных типов.<br />Методы:
		<ul>
	
		<li>Length(): Integer – возвращает длину массива.</li>
			<li>Join(): String – производится склеивание всех объектов типа String входящих в данный массив и возвращение результата в виде строки.</li>
			<li>Invert() – инвертирование массива.</li>
			<li>Sort(): Boolean – сортировка массива(при условии что все его элементы одного типа).</li>
			<li>Sort(key): Boolean – сортировка массива(при условии что все его элементы одного типа и этот тип истинный Object с динамически созданными полями  и обязательно присутствующим полем key).</li>
			<li>Delete(key) : Boolean – удаление элемента массива(при условии что все его элементы одного типа).</li>
	
			<li>Empty() – полная очистка.</li>
		</ul>
	
	
		<h3 id="217-Hash">2.1.7  Hash<a href="#217-Hash" class="wiki-anchor">&para;</a></h3>
	
	
	Объекты данного типа позволяют проиводить базовые операции над хеш-таблицами.
		<ul>
		<li>Add(key, value): Boolean – добавление элемента.</li>
	
			<li>Remove(key): Boolean – удаление элемента.</li>
			<li>HasKey(key): Boolean – проверка хеша на содержание ключа key.</li>
			<li>Marshaling(filename): Boolean – производит маршалинг хеша. </li>
			<li>Demarshaling(filename): Boolean – производит демаршалинг хеша.</li>
			<li>Empty() – полная очистка.</li>
		</ul>
	
	
		<h3 id="22-Конструкции-и-операции">2.2  Конструкции и операции<a href="#22-Конструкции-и-операции" class="wiki-anchor">&para;</a></h3>
	
	
		<p>Основные кострукции и операции языка можно разбить на следующие подгруппы.<br />константы: десятичные, двоичные и восьмиричные;<br />оператор присваивания: &lt;переменная&gt; ’=’ &lt;выражение&gt;;<br />оператор цикла: while (&lt;выражение&gt;)  &lt;оператор&gt;, <br />for (&lt;оператор&gt;; &lt;выражение&gt;;&lt;оператор&gt;) &lt;оператор&gt;,<br />for (&lt;оператор&gt; in &lt;коллекция&gt;) &lt;оператор&gt;;<br />    условный оператор: if (&lt;выражение&gt;) &lt;оператор&gt; [else  &lt;оператор&gt;] [elif &lt;оператор&gt;];<br />арифметические операции (тип Integer, Float): изменение знака ’-’, приоритет 3; умножение ’*’, приоритет 2; целочисленное деление ’/’, приоритет 2; деление по модулю ’%’, приоритет 2; сложение ’+’, приоритет 1; вычитание ’-’, приоритет 1;<br />логические операции (тип Integer, Float, Boolean): отрицание ’^’, приоритет 2; логическое И ’&#38;&#38;’, приоритет 4; логическое ИЛИ ’||’, приоритет 4;<br />операции отношения (тип Integer, Float, Boolean): не равно ’!=’, приоритет 5; равно ’==’, приоритет 5; меньше или равно ’<=’, приоритет 4; меньше ’&lt;’, приоритет 4; больше или равно ’&gt;=’, приоритет 4; больше ’>’, приоритет 4;<br />комментарии: однострочные unix-like подобные - ’#’;<br />операции ввода/вывода input/put(puts);</p>
	
	
		<p>Далее приведены примеры по использованию основных конструкций и выражений.</p>
	
	
		<p><code>var ob = new(); # создание простого объекта(аналог Object в соврем. яп)</code><br /><code>var a = new(Int); # создание объекта типа Integer</code><br /><code>var b = new(Int, 7); # создание объекта Integer и его инициализация</code><br /><code>var s = new(String, «Hello, world!»); # создание объекта String</code><br /><code>a = b + 1; # пример простых операций</code><br /><code>puts a; # \n в конце строки – вывод значений</code><br /><code>put a + b; #вывод значения вычисляемого в результате каких-либо операций</code><br /><code>put s.Split(','); # Разбиение строки на токены</code><br /><code>put a.Split(''); # Ошибка. В «классе» чисел нет метода Split</code></p>
	
	
		<p><code># Работа с аналогами объекта</code></p>
	
	
		<p><code>ob.Name = new(String, «Vasya»); # динамическое добавление поля</code><br /><code>ob.Old = new(Int, 20);</code><br /><code>puts ob.ToString;</code></p>
	
	
		<p><code>var ar = new(Array, []); # создание динамического массива</code><br /><code>var ar2 = new(Array, [3]); # создание простого массива</code><br /><code>ar[] = 1; # пример добавления новых элементов в динам. массив</code><br /><code>ar[] = 3;</code><br /><code>ar[666] = 4;</code></p>
	
	
		<p><code>var h = new(Hash);</code><br /><code>h = ob.ToHash();</code></p>
	
	
		<p><code>ob.Marshaling(“tmp”); # Маршалинг оъекта</code><br /><code>var d = new();</code><br /><code>d.Demarshaling(“tmp”); # Демаршалинг объекта</code></p>
	
	
		<p><code># пример прохождения по хешу(применимо к любой коллекции)</code><br /><code>for(s in h)</code><br /><code>{</code><br /><code>    puts s + « » + h[s];</code><br /><code>}</code></p>
	
	
		<p><code>var ok = new(Boolean, true);</code><br /><code>if (h.Length() &#38;&#38; ok)</code><br /><code>{</code><br /><code>    puts “Length of hash great then 0”;</code><br /><code>}</code><br /><code>else</code><br /><code>{</code><br /><code>    puts “Length of hash eq 0”;</code><br /><code>}</code></p>
	
	
		<p><code>h.Clear(); # очистка коллекции</code></p>
	
	
		<p><code>b.Remove(); # полное «жесткое» удаление объекта</code></p>
	
	
		<h3 id="23-Дополнительная-информация">2.3  Дополнительная информация<a href="#23-Дополнительная-информация" class="wiki-anchor">&para;</a></h3>
	
	
		<p>Семантические ограничения:<br />в одной области видимости переменная не может быть объявлена более одного раза.<br />проверка соответствия типов данных при присваивании;<br />проверка на соответствие типов в логических и арифметических операциях.<br />Стандартные (зарезервированные) идентификаторы языка: var, new, puts, put, input, for, in, while, if, elif, else, Integer, Float, String, Boolean, Array, Hash, true, false. <br />Некоторые ограничения, зарезервированные слова языка в процессе разработки интерпретатора могут модифицироваться, также могут производиться различные дополнения в синтаксисе.</p>
	
	
		<p><strong>Инструментарий:</strong> язык программирования <em>C++</em>, <em>Flex/Byson</em>. <strong>ОС:</strong> <em>Linux</em>.</p>
	
	</div>

</body>